import java.util.Date;

//类与对象的学习
//复习一下
/*class Student{
    //成员变量
    public String name;
    public int age;
    //成员方法
    public void eat()
    {
        System.out.println(this.name + "吃饭了");
    }
}*/
public class TestDemo {
    public static void main(String[] args) {
        /*Student student = new Student();
        student.name = "张三";
        student.age = 19;
        System.out.println(student.name);
        System.out.println(student.age);
        student.eat() ;

        Student student2 = new Student();
        student2.name = "lisi";
        student2.age = 21;
        System.out.println(student2.name);
        System.out.println(student2.age);
        student2.eat();*/
        Student student = new Student();//这部分就表示可以调用了一个不带参数的方法
        Student student1 = new Student("zhangfei" ,99);//这时候我们可以传参


        //当在一个类中，没有任何一个的构造方法的时候，Java会帮你自动提供一个不带参数的方法
        //就是哪怕有一个构造方法，这种情况下也会报错
        //当一个类中，Java不会提供一个构造方法了
    }
    //对象的初始化

//    public static void main(String[] args) {
//        int a;
//        System.out.println(a);
//    }
    //局部变量需要先进行赋值

    //但是我们可以发现了在我们创建了对象的，它并没有进行赋值。
    //当成员变量没有进行初始化的时候
    //引用类型通常是null,基本类型通常是0；
    //特别的基本类型：
    //boolean -- false
    //char -- '\u0000'
    //所以当我们不去进行赋值的时候，编译器会默认它为0值或者null
    //我们可以通过调用的的方式去赋值


    //那么我们除了调用
    //还能有什么办法呢？

    //第一种：构造方法
    //1.方法名必须和类名相同
    //2.没有返回值

}
class Student{
    //成员变量
    public String name;
    public int age;
    //成员方法
    public void eat()
    {
        System.out.println(this.name + "吃饭了");
        this.show();//这种调用的不是构造方法，那么this可以不是在第一行
    }

    //构造
    //可以加一个访问修饰符
//    public Student(){
//        System.out.println("打印一个不带参数的方法");
//    }
    public Student(String name,int age){

        this.name = name;
        this.age = age;
        System.out.println("带有2个参数的构造方法");
    }

    public Student(){
        this("cc",19);
        //this();是调用类当中的其他构造方法，比如这个时候就会调用了public Student(String name,int age)这个方法
        //只能在当前的构造方法内部来使用，并且只能在第一行
        System.out.println("不带参数的构造方法");
    }
    public void show(){
        System.out.println("姓名：" + this.name + "年龄" + this.age);
    }
}
//构造方法：我们就是把对象的构造，就是把对象的成员变量进行了初始化
//构造方法(也称为构造器)是一个特殊的成员方法，名字必须与类名相同，在创建对象时，由编译器自动调用，
//并且在整个对象的生命周期内只调用一次。
//当调用方法完成后，对象才产生了初始值

//注意：构造方法的作用就是对对象中的成员进行初始化，并不负责给对象开辟空间。

//构造方法之间是可以构成方法的重载
//1.方法名相同
//2.参数列表不同

//要完成一个对象的构造，要分为两步
//1.分配内存
//2.调用合适的构造方法

//构造方法的特性；
//1. 名字必须与类名相同
//2. 没有返回值类型，设置为void也不行
//3. 创建对象时由编译器自动调用，并且在对象的生命周期内只调用一次(相当于人的出生，每个人只能出生一次)
//4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
//5. 如果用户没有显式定义，编译器会生成一份默认的构造方法，生成的默认构造方法一定是无参的。
//6. 构造方法中，可以通过this调用其他构造方法来简化代码
//this();是调用类当中的其他构造方法
//只能在当前的构造方法内部来使用，并且只能在第一行
//this.data这种是访问当前对象的属性
//this.func()调用当前对象的方法（也就是成员方法）
//this本身代表的是当前对象的引用
class Date(){
    public Date() {
        this(1991, 1, 1)
    }
    public Date(int year, int month, int day){
        this();
    }
}
//上述代码形成了环，两者互相调用
//7. 绝大多数情况下使用public来修饰，特殊场景下会被private修饰(后序讲单例模式时会遇到)，
//被private修饰之后的构造方法只能在类中使用
